package org.jsola.hr.service;

import org.jsola.admin.vo.HeaderFieldsListVO;
import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ICompanyNecessaryFieldDAO;
import org.jsola.hr.dto.CompanyNecessaryFieldAddDTO;
import org.jsola.hr.dto.CompanyNecessaryFieldBatchDTO;
import org.jsola.hr.dto.CompanyNecessaryFieldUpdateDTO;
import org.jsola.hr.dto.UpdateEmpFieldDTO;
import org.jsola.hr.entity.CompanyNecessaryFieldDO;
import org.jsola.hr.query.CompanyNecessaryFieldQuery;
import org.jsola.hr.query.ModuleFieldQuery;
import org.jsola.hr.vo.*;
import org.jsola.user.core.TokenUser;
import org.springframework.http.HttpMethod;

import java.util.List;
import java.util.Map;


/**
 * 公司员工必填字段信息
 *
 * @author zhr
 */
public interface ICompanyNecessaryFieldService extends IService<ICompanyNecessaryFieldDAO, CompanyNecessaryFieldDO> {

    /**
     * 为所有公司添加字段
     *
     * @param companyNecessaryFieldAddDTO 修改对象
     * @param tokenUser                   当前用户
     * @return 初始化成功公司数量
     */
    int addFiledForAllCompany(CompanyNecessaryFieldAddDTO companyNecessaryFieldAddDTO, TokenUser tokenUser);

    /**
     * 新增公司员工必填字段信息
     *
     * @param companyNecessaryFieldAddDTO 新增公司员工必填字段信息DTO
     * @param tokenUser                   当前用户
     * @return 公司员工必填字段信息详情信息
     */
    CompanyNecessaryFieldVO save(CompanyNecessaryFieldAddDTO companyNecessaryFieldAddDTO, TokenUser tokenUser);

    /**
     * 批量新增公司员工必填字段信息
     * @param companyNecessaryFieldAddDTOList 新增公司员工必填字段信息DTO
     * @param tokenUser 当前用户
     * @return 公司员工必填字段信息详情信息
     */
    List<CompanyNecessaryFieldVO> batchSave(List<CompanyNecessaryFieldAddDTO> companyNecessaryFieldAddDTOList, TokenUser tokenUser);

    /**
     * 修改公司员工必填字段信息
     *
     * @param companyNecessaryFieldUpdateDTO 修改公司员工必填字段信息DTO
     * @param tokenUser                      当前用户
     * @return 更新数量
     */
    int update(CompanyNecessaryFieldUpdateDTO companyNecessaryFieldUpdateDTO, TokenUser tokenUser);

    /**
     * 小程序端修改公司员工信息
     *
     * @param companyFieldAndValueListVO 公司员工信息
     * @param tokenUser                  当前用户
     * @param type                       类型
     * @return 更新数量
     */
    int updateForApp(CompanyFieldAndValueListVO companyFieldAndValueListVO, TokenUser tokenUser, String type);

    /**
     * 小程序端修改某个模块的信息
     *
     * @param companyFieldAndValueUpdateVO 模块的信息
     * @param tokenUser                    当前用户
     * @return 更新数量
     */
    int updateAppForModule(CompanyFieldAndValueUpdateVO companyFieldAndValueUpdateVO, TokenUser tokenUser);


    /**
     * 批量删除公司员工必填字段信息，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser                当前用户
     * @param companyNecessaryFieldIds 公司员工必填字段信息id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... companyNecessaryFieldIds);

    /**
     * 根据公司员工必填字段信息id查找
     *
     * @param companyNecessaryFieldId 公司员工必填字段信息id
     * @param siteId                  所属站点id
     * @return 公司员工必填字段信息详情信息
     */
    CompanyNecessaryFieldVO selectById(String companyNecessaryFieldId, String siteId);

    /**
     * 查询公司员工必填字段信息
     *
     * @param companyNecessaryFieldQuery 查询条件
     * @param tokenUser                  登录人
     * @return 公司员工必填字段信息列表信息
     */
    List<CompanyNecessaryFieldListVO> select(CompanyNecessaryFieldQuery companyNecessaryFieldQuery, TokenUser tokenUser);


    /**
     * 查询当前模块下当前字段名称
     *
     * @param moduleCode 模块code
     * @param filedName  字段名称
     * @param companyId  公司id
     * @return 存在的列表
     */
    List<CompanyNecessaryFieldDO> selectByModuleAndFiledName(String moduleCode, String filedName, String companyId);

    /**
     * 查询当前字段名称
     *
     * @param filedNames  字段名称
     * @return 存在的列表
     */
    List<CompanyNecessaryFieldDO> selectByFiledNames(List<String> filedNames);

    /**
     * pc端查询公司员工必填字段信息
     *
     * @param companyNecessaryFieldQuery 查询条件
     * @param tokenUser                  登录人
     * @return 公司员工必填字段信息列表信息
     */
    CompanyFieldForPcListVO listAllForPc(CompanyNecessaryFieldQuery companyNecessaryFieldQuery, TokenUser tokenUser);

    /**
     * 甲方端租户过滤字段(工作性质) 返回true需要被过滤掉
     *
     * @param fieldName 字段名称
     * @param siteId    站点信息
     * @return 是否需要被过滤
     */
    boolean filterField(String fieldName, String siteId);

    /**
     * pc端查询公司员工动态字段信息（员工字段设置）
     *
     * @param companyNecessaryFieldQuery query对象
     * @param tokenUser                  当前登录用户
     * @return 所有字段对象
     */
    List<CompanyFieldInfoVO> listForPc(CompanyNecessaryFieldQuery companyNecessaryFieldQuery, TokenUser tokenUser);

    /**
     * pc端查询公司员工动态字段信息 租户级自定义字段查询全部用工单位自定义字段 租户级companyId为(入职模板设置)
     *
     * @param companyNecessaryFieldQuery query对象
     * @param tokenUser                  当前登录用户
     * @return 所有字段对象
     */
    List<CompanyFieldInfoVO> listForPc2(CompanyNecessaryFieldQuery companyNecessaryFieldQuery, TokenUser tokenUser);

    /**
     * 查询公司的所有moduleCode
     *
     * @param companyNecessaryFieldQuery query对象
     * @param tokenUser                  当前登录用户
     * @return moduleCode列表
     */
    List<CompanyNecessaryModuleCodeVO> listCompanyModuleCodes(CompanyNecessaryFieldQuery companyNecessaryFieldQuery, TokenUser tokenUser);

    /**
     * 设置工作性质
     * @param fieldList
     * @param tokenUser
     */
    void setPostType(List<CompanyNecessaryFieldVO> fieldList, TokenUser tokenUser);

    /**
     * 获取员工动态字段值
     *
     * @param moduleFieldQuery query对象
     * @param tokenUser        当前登录用户
     * @return vo
     */
    EmpFieldValueVO getEmpFieldValue(ModuleFieldQuery moduleFieldQuery, TokenUser tokenUser);

    /**
     * 修改员工动态字段的值
     *
     * @param updateEmpFieldDTO 修改对象
     * @param httpMethod        请求方式
     * @param isVerify          是否校验必填
     * @param tokenUser         当前登录用户
     */
    void updateEmpFieldValue(UpdateEmpFieldDTO updateEmpFieldDTO, HttpMethod httpMethod, Boolean isVerify, TokenUser tokenUser);

    /**
     * 校验员工动态表单必填
     *
     * @param empId     员工id
     * @param companyId 公司id
     * @param tokenUser 当前登录用户
     */
    void checkEmpFieldValue(String empId, String companyId, TokenUser tokenUser);

    /**
     * app端查询公司员工必填字段信息及其具体的值
     *
     * @param companyNecessaryFieldQuery 查询条件
     * @param tokenUser                  登录人
     * @return 公司员工必填字段信息列表信息
     */
    CompanyFieldAndValueListVO listAllForApp(CompanyNecessaryFieldQuery companyNecessaryFieldQuery, TokenUser tokenUser);

    /**
     * app端查询公司员工必填字段信息及其具体的值
     *
     * @param companyNecessaryFieldQuery 查询条件
     * @param empIdList                  员工id集合
     * @param tokenUser                  登录人
     * @return 公司员工必填字段信息列表信息
     */
    List<CompanyFieldAndValueListVO> listAllForApp2(CompanyNecessaryFieldQuery companyNecessaryFieldQuery,
                                                    List<String> empIdList, TokenUser tokenUser);


    /**
     * app端查询当前员工必填模块信息
     *
     * @param companyNecessaryFieldQuery 查询条件
     * @param tokenUser                  登录人
     * @return 公司员工必填模块列表信息
     */
    List<String> listNecessaryModeForApp(CompanyNecessaryFieldQuery companyNecessaryFieldQuery, TokenUser tokenUser);


    /**
     * app端查询当前员工某个模块的字段信息
     *
     * @param companyNecessaryFieldQuery 查询条件
     * @param tokenUser                  登录人
     * @return 公司员工必填字段信息列表信息
     */
    List<CompanyNecessaryFieldVO> listForAppModule(CompanyNecessaryFieldQuery companyNecessaryFieldQuery, TokenUser tokenUser);

    /**
     * 查询公司员工必填字段信息记录数
     *
     * @param companyNecessaryFieldQuery 查询条件
     * @param siteId                     所属站点id
     * @return 公司员工必填字段信息记录数
     */
    int selectCount(CompanyNecessaryFieldQuery companyNecessaryFieldQuery, String siteId);

    /**
     * 分页查询公司员工必填字段信息
     *
     * @param companyNecessaryFieldQuery 查询条件
     * @param siteId                     所属站点id
     * @return 公司员工必填字段信息列表信息
     */
    Page<CompanyNecessaryFieldListVO> selectPage(CompanyNecessaryFieldQuery companyNecessaryFieldQuery, String siteId);


    /**
     * 根据公司员工必填字段信息id查找
     *
     * @param companyNecessaryFieldId 公司员工必填字段信息id
     * @param siteId                  所属站点id
     * @return 公司员工必填字段信息
     */
    CompanyNecessaryFieldDO selectDOById(String companyNecessaryFieldId, String siteId);

    /**
     * 根据公司员工必填字段信息id查找
     *
     * @param companyNecessaryFieldIds 公司员工必填字段信息id
     * @param siteId                   所属站点id
     * @return 公司员工必填字段信息
     */
    List<CompanyNecessaryFieldDO> selectDOByIds(List<String> companyNecessaryFieldIds, String siteId);

    /**
     * 查询公司员工必填字段信息
     *
     * @param companyNecessaryFieldQuery 查询条件
     * @param siteId                     所属站点id
     * @return 公司员工必填字段信息列表
     */
    List<CompanyNecessaryFieldDO> selectDO(CompanyNecessaryFieldQuery companyNecessaryFieldQuery, String siteId);

    /**
     * 根据id批量修改是否必填和是否启用
     *
     * @param companyNecessaryFieldBatchDTO 是否必填和启用的参数集合
     * @param tokenUser                     当前用户
     * @return 修改个数
     */
    Integer updateNecessaryBatch(CompanyNecessaryFieldBatchDTO companyNecessaryFieldBatchDTO, TokenUser tokenUser);

    /**
     * 初始化公司的必填项
     *
     * @param companyId 公司id
     * @param tokenUser 当前用户信息
     * @return 返回个数
     */
    Integer necessaryInitializationByCompanyId(String companyId, TokenUser tokenUser);

    /**
     * 查询系统默认的必填信息
     *
     * @return
     */
    List<CompanyNecessaryFieldDO> listBySystem();

    /**
     * 初始化系统默认数据（不要乱调！不要乱调！不要乱调！）
     *
     * @param tokenUser 当前用户
     * @return 初始化数量
     */
    int initSystemData(TokenUser tokenUser);

    /**
     * 根据默认数据更新用工单位缺少的字段（不要乱调！不要乱调！不要乱调！）
     *
     * @return 初始化数量
     */
    int updateBySystemData();

    /**
     * 基本信息的完善信息
     *
     * @param companyFieldAndValueListVO 基本信息
     * @param type                       类型
     * @param companyId                  公司Id
     * @param tokenUser                  当前用户
     * @return 失败字段
     */
    String findNotCompleteUpdate(CompanyFieldAndValueListVO companyFieldAndValueListVO, String type, String companyId, TokenUser tokenUser);

    /**
     * 额外字段信息的修改
     *
     * @param companyFieldAndValueListVO 额外字段信息
     * @param type                       类型
     * @return 失败字段
     */
    String findNotCompleteAdditional(CompanyFieldAndValueListVO companyFieldAndValueListVO, String type);

    /**
     * 查询moduleCode的所有字段
     *
     * @param moduleCode moduleCode
     * @param companyId  公司id
     * @param siteId     站点id
     * @return 字段list
     */
    List<CompanyNecessaryFieldDO> selectByModuleCode(String moduleCode, String companyId, String siteId);

    /**
     * 查询公司所有模块字段
     *
     * @param companyId 公司id
     * @param siteId    站点id
     * @return 字段list
     */
    List<CompanyNecessaryFieldDO> selectByCompanyId(String companyId, String siteId);

    /**
     * 查询公司所有需要校验的字段
     *
     * @param companyId 公司id
     * @param siteId    站点id
     * @return 字段list
     */
    List<CompanyNecessaryFieldDO> selectCompanyAllNeedCheckField(String companyId, String siteId);

    /**
     * 预登记人员添加模块信息
     *
     * @param companyId 用工单位id
     * @param tokenUser 当前用户
     */
    void checkInAddNecessaryField(String companyId, TokenUser tokenUser);


    /**
     * 查询公司某个模块的所有必填字段
     *
     * @param companyId   公司id
     * @param moduleCodes 模块
     * @param siteId      站点id
     * @return list
     */
    List<CompanyNecessaryFieldDO> selectByCompanyAndModuleCodes(String companyId, List<String> moduleCodes, String siteId);

    /**
     * 查询全部公司的必填字段
     *
     * @return
     */
    List<CompanyNecessaryFieldDO> listAll();

    /**
     * 获取未选择的自定义字段（花名册自定义表头）
     *
     * @param companyId 用工单位id
     * @param tokenUser 当前用户
     * @return 字段list
     */
    List<HeaderFieldsListVO> getCustomField(String companyId, TokenUser tokenUser);

    /**
     * 向所有用工单位添加公司员工必填字段信息(慎用)
     *
     * @param yourName                         操作者名字
     * @param companyNecessaryFieldAddDTOList 公司员工必填字段
     * @return 添加条数
     */
    int addAllCompanyFields(String yourName, List<CompanyNecessaryFieldAddDTO> companyNecessaryFieldAddDTOList);

    List<CompanyNecessaryModuleCodeVO> listCompanyModuleCodesForEmployee(CompanyNecessaryFieldQuery companyNecessaryFieldQuery, TokenUser tokenUser);

    Map<String,EmpFieldValueVO> getAllEmpFieldValue(ModuleFieldQuery moduleFieldQuery, TokenUser tokenUser);
}


